/**
 * HTTP请求工具，自动处理身份验证
 */

// 用于防止重定向循环的标记
let isRedirecting = false;

/**
 * 发送HTTP请求并自动添加身份验证token
 * @param {string} url - 请求URL
 * @param {object} options - fetch选项
 * @returns {Promise} - fetch返回的Promise
 */
export async function http(url, options = {}) {
  // 如果是登录或注册相关的请求，不需要添加token
  const isAuthUrl = url.includes('/api/auth/login') || url.includes('/api/auth/register');
  
  // 从localStorage获取token
  const token = localStorage.getItem('access_token');
  
  // 准备headers
  const headers = {
    'Content-Type': 'application/json',
    ...options.headers,
  };
  
  // 如果有token并且不是认证URL，添加到headers
  if (token && !isAuthUrl) {
    headers['Authorization'] = `Bearer ${token}`;
  }
  
  // 构建完整的请求选项
  const requestOptions = {
    ...options,
    headers,
  };
  
  // 发送请求
  try {
    const response = await fetch(url, requestOptions);
    
    // 处理401未授权错误，但不处理认证相关的URL，防止循环
    if (response.status === 401 && !isAuthUrl && !isRedirecting) {
      // 检查当前路径是否已经是登录页
      const isLoginPage = window.location.pathname === '/login';
      
      // 只有不在登录页时才重定向，防止循环
      if (!isLoginPage) {
        isRedirecting = true;
        
        // 清除所有认证信息
        localStorage.removeItem('access_token');
        localStorage.removeItem('refresh_token');
        localStorage.removeItem('user');
        
        // 重定向到登录页
        window.location.href = '/login';
        return new Response(JSON.stringify({ message: 'Unauthorized, redirecting...' }), {
          status: 401,
          headers: { 'Content-Type': 'application/json' }
        });
      }
    }
    
    return response;
  } catch (error) {
    console.error('请求错误:', error);
    throw error;
  } finally {
    // 重置重定向标记，但延迟一点以防止同时发生的多个请求导致多次重定向
    if (isRedirecting) {
      setTimeout(() => {
        isRedirecting = false;
      }, 1000);
    }
  }
}

/**
 * 刷新token
 * @returns {Promise<boolean>} 是否成功刷新token
 */
async function refreshToken() {
  const refreshToken = localStorage.getItem('refresh_token');
  if (!refreshToken) return false;
  
  try {
    const response = await fetch('/api/auth/refresh/', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ refresh: refreshToken }),
    });
    
    if (!response.ok) throw new Error('刷新token失败');
    
    const data = await response.json();
    localStorage.setItem('access_token', data.access);
    return true;
  } catch (error) {
    console.error('刷新token失败:', error);
    return false;
  }
}

export default http; 